package co.com.sewebpoint.dao;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import co.com.sewebpoint.exception.DaoExceptionSE;

/**
 * Clase que define la fabrica de sessiones que manejara hibernate, esta clase 
 * utilizara el patron Singleton para solo ser instanciada una vez en toda la vida 
 * del sistema web 
 * 
 * @author Esteban Hurtado y Sara Tamayo
 * @version 1.0
 */



public class HibernateSessionFactory {
	
	private static HibernateSessionFactory instancia = null;
	private static  SessionFactory sessionFactory = null;
	private static Configuration  configuracion = new Configuration();

	
	/**
	 * 
	 * Constructor privado para no se instanciado fuera de estea clase
	 * 
	 */
	
	private HibernateSessionFactory() {
		// TODO Auto-generated constructor stub
	}
	
    
	/**
     * Metodo que crea si no existe y retorna la instancia de esta clase que utiliza el patron singleton
     * @return HibernateSessionFactory retorna la instancia statica de esta clase
     */
	
	
	public static HibernateSessionFactory getInstancia(){
		
		if(instancia==null){ // se revisa si la instancia ya esta creada si no se crea
			instancia = new HibernateSessionFactory(); // se crea la instancia 
		}
		
		return instancia; // retorna la instacia 
	}
	
	/**
     * Metodo que retorna una session de acceso a la base de datos 
     
     * @return Session retorna una session a la base de datos
     */
	
	
	public Session getSession() throws DaoExceptionSE{
		
		try{
			if(sessionFactory==null){ 
				configuracion.configure("co/com/sewebpoint/dao/cnf/hibernate.cfg.xml"); // carga la configuracion de acceso a la base de datos
			
				sessionFactory = configuracion.buildSessionFactory();
			
			}
			
			return sessionFactory.openSession();
			
			
		}catch(HibernateException e){
			
			throw new DaoExceptionSE(e);
			
		}
		
		
	}
	
	
	
}
